﻿using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace ProjetoGrupo2
{
    class Personagem : AnimatedObject
    {
        float gravidade;
        float velocidadeY;

        RolagemCena rolagemCena;
        
        bool flip;
        
        KeyboardState teclado;
        KeyboardState tecladoAntigo;
        bool podePular;
        int Height;
        int Width;


        public Personagem(Texture2D texture, int Width, int Height)// FUNÇÃO QUE DEFINE TODAS AS PROPRIEDADES QUE QUALQUER PERSONAGEM CRIADO POR ESSA CLASSE USARA;


            : base(texture, Width, Height)
        {
            flip = false;

            AnimationStructure animationCorrendo = new AnimationStructure(); //ANIMAÇÃO DO PERSONAGEM CORRENDO 
            animationCorrendo.frameCount = 5;
            animationCorrendo.frameWidth = Width;
            animationCorrendo.frameHeight = Height;
            animationCorrendo.framePerSecond = 12;
            animationCorrendo.framePerSecond = 6;
            animationCorrendo.X = 57;
            animationCorrendo.Y = 0;
            listaAnimations.Add("correndo", animationCorrendo);

            
            AnimationStructure animationParado = new AnimationStructure();
            animationParado.frameCount = 1;
            animationParado.frameWidth = Width;
            animationParado.frameHeight = Height;
            animationParado.framePerSecond = 10;
            animationParado.X = 0;
            animationParado.Y = 0;
            listaAnimations.Add("parado", animationParado);

            ChangeAnimation("parado");

            
            AnimationStructure animationPulando = new AnimationStructure();// ANIMAÇÃO DO PERSONAGEM PULANDO 
            animationPulando.frameCount = 5;
            animationPulando.frameWidth = Width;
            animationPulando.frameHeight = Height;
            animationPulando.framePerSecond = 10;
            animationPulando.X = 0;
            animationPulando.Y = 88;
            listaAnimations.Add("pulando", animationPulando);

            AnimationStructure animationAtirando= new AnimationStructure();
            animationAtirando.frameCount = 2;
            animationAtirando.frameWidth = Width;
            animationAtirando.frameHeight = Height;
            animationAtirando.framePerSecond = 2;
            animationAtirando.X = 0;
            animationAtirando.Y = 176;
            listaAnimations.Add("tiro", animationAtirando);

            AnimationStructure animationDano = new AnimationStructure();// ANIMAÇÃO DO PERSONAGEM PULANDO 
            animationDano.frameCount = 4;
            animationDano.frameWidth = Width;
            animationDano.frameHeight = Height;
            animationDano.framePerSecond = 10;
            animationDano.X = 0;
            animationDano.Y = 264;
            listaAnimations.Add("dano", animationDano);


            posicaoChao = new Vector2(300, 300);
            gravidade = 0.1f; //VALOR INICIAL DA GRAVIDADE NO JOGO
            velocidadeY = -1; // VELOCIDADE INICIAL DA PROPRIEDADE Y DO JOGO
            podePular = true; // BOOLEANA QUE DIZ SE O BONECO PODE PULAR OU NAO

           
            if (flip)
            {
                efeito = SpriteEffects.FlipHorizontally;
            }
            else
            {
                ChangeAnimation("parado");
            }

            this.retanguloDeCorte.Height -= Height / 2;
            //A ALTURA E A LARGURA DA CLASSE RECERÃO OS VALORES DE SUAS RESPECTIVAS CLASSES .
            this.Width = Width;
            this.Height = Height;

        }

        

        public override void Update(GameTime gameTime) //FUNÇÃO DE ATUALIZAÇÃO DO JOGO
        {
            
            
            teclado = Keyboard.GetState();
           
            

            //if (teclado.IsKeyDown(Keys.Left))
            //{
            //    ChangeAnimation("correndo");
            //    efeito = SpriteEffects.None;

               
            //}




            //else if (teclado.IsKeyDown(Keys.Right))
            //{
            //    ChangeAnimation("correndo");
            //    efeito = SpriteEffects.FlipHorizontally;
               
            //}


            //else if(teclado.IsKeyUp(Keys.Left) && tecladoAntigo.IsKeyUp(Keys.Right))
            //{
            //    ChangeAnimation("default");
            //}




            //CRIAÇÃO DO PULO DO PERSONAGEM

                     
            if (podePular == false)// SE O PERSONAGEM NAO PUDER PULAR OU SEJA SE O BOTÃO DE PULO JA ESTIVER APERTADO E O PERSONAGEM JA ESTIVER NO ALTO
            {
                

                velocidadeY += gravidade; // A VELOCIDADE RECEBERA A CADA ATUALIZAÇÃO O VALOR DA GRAVIDADE, DIMINUINDO CADA VEZ MAIS
                posicao.Y += velocidadeY;// A POSIÇÃO Y RECEBERA A CADA ATUALIZAÇÃO O VALOR DA VELOCIDADE E ISSO FARA COM Q A ALTURA EM Q O OBJETO ESTA VA DIMINUINDO.

                if (posicao.Y > posicaoChao.Y) // SE A POSIÇÃO Y DO PERSONAGEM FOR MAIOR QUE A POSIÇÃO DO CHAO: 
                {
                    posicao.Y = (posicaoChao.Y) - (texture.Height / 2);// A POSIÇÃO Y DO PERSONAGEM  RECEBE A POSIÇÃO Y - ALTURA DO PERSONAGEM
                    velocidadeY = 0;
                    podePular = true;

                    posicao.Y = posicaoChao.Y;

                }

                }



                if (podePular == true) // SE ELE PODER PULAR OU SEJA NAO ESTIVER PULANDO E O BOTÃO NAO ESTIVER APERTADO
                {
                    
                    if(teclado.IsKeyUp(Keys.Z))
                    {
                        ChangeAnimation("parado");
                        if (flip)
                        {
                            efeito = SpriteEffects.FlipHorizontally;
                        }
                        

                    }
                   

                }


            if (Keyboard.GetState().IsKeyDown(Keys.Up) && posicao.Y >= 280 - (Height / 2) && podePular == true) // SE O BOTÃO UP ESTIVER APERTADO E A POSIÇÃO Y FOR MAIOR OU IGUAL A 280 - A ALTURA DIVIDIDO POR 2 E ELE ELE TIVER PERMIÇÃO PARA PULAR
            {
                posicao.Y -= 2;// A POSIÇÃO Y 6 PARA CIMA EM CADA UPDATE;
                posicaoChao.Y = posicao.Y; // POSIÇÃO DO CHAO RECEBE POSIÇÃO Y
                ChangeAnimation("correndo");
            }

            if (Keyboard.GetState().IsKeyDown(Keys.Down) && posicao.Y < 400 - (Height / 2) && podePular == true)
            {
                posicao.Y += 2;
                posicaoChao.Y = posicao.Y;
                ChangeAnimation("correndo");
            }

             if (Keyboard.GetState().IsKeyDown(Keys.Left) && podePular == true) 
             {
                 
                 ChangeAnimation("correndo");
                 efeito = SpriteEffects.FlipHorizontally;
                 flip = true;
                 
                 this.posicao.X -= 2;



                 if (Keyboard.GetState().IsKeyUp(Keys.Left) && podePular == true)
                 {
                     efeito = SpriteEffects.FlipHorizontally;

                 }



                 if (Keyboard.GetState().IsKeyDown(Keys.Z) && (tecladoAntigo.IsKeyUp(Keys.Z)))
                 {
                     //ChangeAnimation("tiro");
                     if (flip)
                     {
                         efeito = SpriteEffects.FlipHorizontally;
                     }
                 }
             }

             if (Keyboard.GetState().IsKeyDown(Keys.Right) && podePular == true) 
             {

               
                 ChangeAnimation("correndo");
                 efeito = SpriteEffects.None;
                 flip = false;
                 //rolagemCena.Update(gameTime);
                               
             }

             if (Keyboard.GetState().IsKeyDown(Keys.Z) && (tecladoAntigo.IsKeyUp(Keys.Z) ))
             {
                 
                
                 TiroManager.AddTiro(this.posicao, 0, flip);
                 if (flip)
                 {
                     ChangeAnimation("tiro");
                     efeito = SpriteEffects.FlipHorizontally;
                 }
                 else
                 {
                     ChangeAnimation("tiro");
                 }
                

                 //efeito = SpriteEffects.None;
                 //rolagemCena.Update(gameTime);

             }


            

             if (Keyboard.GetState().IsKeyDown(Keys.Space) && tecladoAntigo.IsKeyUp(Keys.Space) && posicao.Y == posicaoChao.Y)
             {
                 ;
                 podePular = false;
                 velocidadeY = -5;

                 ChangeAnimation("pulando"); //COMANDO QUE EXECUTA A ANIMAÇÃO

             }


            



            

            tecladoAntigo = teclado;
            base.Update(gameTime);
            this.collisionBounds.Height -= Height / 2;
        }

    }
}


